package com.neusoft.javafeatures9.nionetty.userguide4x.discard;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;

/**
 * Handles a server-side channel.
 */
public class DiscardServerHandler extends ChannelInboundHandlerAdapter { // (1)

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) { // (2)
        //========================================================
        //   接收消息
        //========================================================
        ByteBuf in = (ByteBuf) msg;
        try {
            //((ByteBuf) msg).release();//1、直接丢弃

            //2、低效的抓换方式
           /* while (in.isReadable()) { // (1)
                System.err.print((char) in.readByte());
                System.out.flush();
            }*/

            //3、一行转换,对接收到的消息进行打印；
            System.out.println(in.toString(io.netty.util.CharsetUtil.UTF_8));



            //========================================================
            //   发送消息
            //========================================================
            ctx.write(msg); // (1)
            ctx.flush(); // (2)
        } finally {
            //ByteBuf是一个引用计数的对象，必须通过该release()方法显式释放
            //这里执行释放了，流就关闭了
            // 只有 DISCARD 服务器，这里才进行释放操作；
            //ReferenceCountUtil.release(msg); // (2)
        }
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { // (4)
        // Close the connection when an exception is raised.
        cause.printStackTrace();
        ctx.close();
    }
}
